ostree export: Add --prefix option
authorAlexander Larsson <alexl@redhat.com>
Mon, 18 Apr 2016 12:26:02 +0000 (14:26 +0200)
committerColin Walters (automation) <walters+githubbot@verbum.org>
Tue, 19 Apr 2016 12:28:06 +0000 (12:28 +0000)
This lets you set a prefix for the resulting archive patsh.
Especially useful in combination with --subpath, for instance
--subpath=subdir --prefix=subdir to extract just subdir.

Closes: #265
Approved by: cgwalters

src/libostree/ostree-repo-libarchive.c
src/libostree/ostree-repo.h
src/ostree/ot-builtin-export.c
tests/test-export.sh

index 6e6e9806cc0dc76c52c0afa241d6dba5f8d77fd8..6856e94b47d9ac913f18bbb6a452b2acb37c8153 100644 (file)
@@ -480,6 +480,12 @@ file_to_archive_entry_common (GFile         *root,
   g_autoptr(GVariant) xattrs = NULL;
   time_t ts = (time_t) opts->timestamp_secs;
 
+  if (opts->path_prefix && opts->path_prefix[0])
+    {
+      g_autofree char *old_pathstr = pathstr;
+      pathstr = g_strconcat (opts->path_prefix, old_pathstr, NULL);
+    }
+
   if (pathstr == NULL || !pathstr[0])
     {
       g_free (pathstr);
index 8a04e8e52f48ac3b18c3a79b43f2989fe1b9acdd..20873a05d46cfe803a1a1a4d7f8d9d4f7d85983c 100644 (file)
@@ -610,7 +610,10 @@ typedef struct {
   guint64 timestamp_secs;
 
   guint unused_uint[8];
-  gpointer unused_ptrs[8];
+
+  char *path_prefix;
+
+  gpointer unused_ptrs[7];
 } OstreeRepoExportArchiveOptions;
 
 _OSTREE_PUBLIC
index 9a7842abb6c8049ed3cec3210162f6edda48e4e3..5b84d1ab51a235c5735214e1879c1c5ee20f6dc9 100644 (file)
 
 static char *opt_output_path;
 static char *opt_subpath;
+static char *opt_prefix;
 static gboolean opt_no_xattrs;
 
 static GOptionEntry options[] = {
   { "no-xattrs", 0, 0, G_OPTION_ARG_NONE, &opt_no_xattrs, "Skip output of extended attributes", NULL },
   { "subpath", 0, 0, G_OPTION_ARG_STRING, &opt_subpath, "Checkout sub-directory PATH", "PATH" },
+  { "prefix", 0, 0, G_OPTION_ARG_STRING, &opt_prefix, "Add PATH as prefix to archive pathnames", "PATH" },
   { "output", 'o', 0, G_OPTION_ARG_STRING, &opt_output_path, "Output to PATH ", "PATH" },
   { NULL }
 };
@@ -132,6 +134,8 @@ ostree_builtin_export (int argc, char **argv, GCancellable *cancellable, GError
   else
     subtree = g_object_ref (root);
 
+  opts.path_prefix = opt_prefix;
+
   if (!ostree_repo_export_tree_to_archive (repo, &opts, (OstreeRepoFile*)subtree, a,
                                            cancellable, error))
     goto out;
index 8666e1772cd6ed64220c9749b42d5083562330f6..856c407361c474ffbb354253691a07b559b76fec 100755 (executable)
@@ -23,7 +23,7 @@ set -euo pipefail
 
 setup_test_repository "archive-z2"
 
-echo '1..3'
+echo '1..5'
 
 $OSTREE checkout test2 test2-co
 $OSTREE commit --no-xattrs -b test2-noxattrs -s "test2 without xattrs" --tree=dir=test2-co
@@ -47,7 +47,26 @@ assert_file_empty diff.txt
 
 echo 'ok export --subpath gnutar diff (no xattrs)'
 
-rm test2.tar test2-subpath.tar diff.txt t t2 -rf
+cd ${test_tmpdir}
+${OSTREE} 'export' test2-noxattrs --prefix=the-prefix/ -o test2-prefix.tar
+mkdir t3
+(cd t3 && tar xf ../test2-prefix.tar)
+${CMD_PREFIX} ostree --repo=repo diff --no-xattrs test2-noxattrs ./t3/the-prefix > diff.txt
+assert_file_empty diff.txt
+
+echo 'ok export --prefix gnutar diff (no xattrs)'
+
+cd ${test_tmpdir}
+${OSTREE} 'export' test2-noxattrs --subpath=baz --prefix=the-prefix/ -o test2-prefix-subpath.tar
+mkdir t4
+(cd t4 && tar xf ../test2-prefix-subpath.tar)
+${CMD_PREFIX} ostree --repo=repo diff --no-xattrs ./t4/the-prefix ./t/baz > diff.txt
+${CMD_PREFIX} ostree --repo=repo diff --no-xattrs test2-noxattrs ./t3/the-prefix > diff.txt
+assert_file_empty diff.txt
+
+echo 'ok export --prefix --subpath gnutar diff (no xattrs)'
+
+rm test2.tar test2-subpath.tar diff.txt t t2 t3 t4 -rf
 
 cd ${test_tmpdir}
 ${OSTREE} 'export' test2 -o test2.tar